home *** CD-ROM | disk | FTP | other *** search
/ PC Advisor 2011 May / PC Advisor 190 E.iso / pc / ESSENTIALS / VLC Media Player 1.1 / vlc-1.1.5-win32.exe / sdk / include / vlc / plugins / vlc_common.h < prev    next >
Encoding:
C/C++ Source or Header  |  2010-11-13  |  29.9 KB  |  929 lines

  1. /*****************************************************************************
  2.  * common.h: common definitions
  3.  * Collection of useful common types and macros definitions
  4.  *****************************************************************************
  5.  * Copyright (C) 1998-2005 the VideoLAN team
  6.  * $Id: 6855d335d6262706c4291a9f35d8cc797fa93f9a $
  7.  *
  8.  * Authors: Samuel Hocevar <sam@via.ecp.fr>
  9.  *          Vincent Seguin <seguin@via.ecp.fr>
  10.  *          Gildas Bazin <gbazin@videolan.org>
  11.  *
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2 of the License, or
  15.  * (at your option) any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; if not, write to the Free Software
  24.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  25.  *****************************************************************************/
  26.  
  27. /**
  28.  * \file
  29.  * This file is a collection of common definitions and types
  30.  */
  31.  
  32. #ifndef VLC_COMMON_H
  33. # define VLC_COMMON_H 1
  34.  
  35. /*****************************************************************************
  36.  * Required vlc headers
  37.  *****************************************************************************/
  38. #if defined( _MSC_VER )
  39. #   pragma warning( disable : 4244 )
  40. #endif
  41.  
  42. #include "vlc_config.h"
  43.  
  44. /*****************************************************************************
  45.  * Required system headers
  46.  *****************************************************************************/
  47. #include <stdlib.h>
  48. #include <stdarg.h>
  49.  
  50. #include <string.h>
  51. #include <stdio.h>
  52. #include <inttypes.h>
  53. #include <stddef.h>
  54.  
  55. #ifndef __cplusplus
  56. # include <stdbool.h>
  57. #endif
  58.  
  59. /* Try to fix format strings for all versions of mingw and mingw64 */
  60. #if defined( _WIN32 ) && defined( __USE_MINGW_ANSI_STDIO )
  61.  #undef PRId64
  62.  #define PRId64 "lld"
  63.  #undef PRIi64
  64.  #define PRIi64 "lli"
  65.  #undef PRIu64
  66.  #define PRIu64 "llu"
  67.  #undef PRIo64
  68.  #define PRIo64 "llo"
  69.  #undef PRIx64
  70.  #define PRIx64 "llx"
  71.  #define snprintf        __mingw_snprintf
  72.  #define vsnprintf       __mingw_vsnprintf
  73. #endif
  74.  
  75. /* Format string sanity checks */
  76. #ifdef __GNUC__
  77. #   if defined( _WIN32 ) && (__GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 4 ) )
  78. #     define LIBVLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y)))
  79. #   else
  80. #     define LIBVLC_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
  81. #   endif
  82. #   define LIBVLC_FORMAT_ARG(x) __attribute__ ((format_arg(x)))
  83. #   if __GNUC__ > 3 || (__GNUC__ == 3 && (__GNUC_MINOR__ >= 4))
  84. #     define LIBVLC_USED __attribute__ ((warn_unused_result))
  85. #   else
  86. #     define LIBVLC_USED
  87. #   endif
  88. #   define LIBVLC_MALLOC __attribute__ ((malloc))
  89. #else
  90. #   define LIBVLC_FORMAT(x,y)
  91. #   define LIBVLC_FORMAT_ARG(x)
  92. #   define LIBVLC_USED
  93. #   define LIBVLC_MALLOC
  94. #endif
  95.  
  96. /* Branch prediction */
  97. #ifdef __GNUC__
  98. #   define likely(p)   __builtin_expect(!!(p), 1)
  99. #   define unlikely(p) __builtin_expect(!!(p), 0)
  100. #else
  101. #   define likely(p)   (!!(p))
  102. #   define unlikely(p) (!!(p))
  103. #endif
  104.  
  105. /*****************************************************************************
  106.  * Basic types definitions
  107.  *****************************************************************************/
  108. #if defined( WIN32 ) || defined( UNDER_CE )
  109. #   include <malloc.h>
  110. #   ifndef PATH_MAX
  111. #       define PATH_MAX MAX_PATH
  112. #   endif
  113. #endif
  114.  
  115. /* Counter for statistics and profiling */
  116. typedef unsigned long       count_t;
  117.  
  118. /* Audio volume */
  119. typedef uint16_t            audio_volume_t;
  120.  
  121. /**
  122.  * High precision date or time interval
  123.  *
  124.  * Store a high precision date or time interval. The maximum precision is the
  125.  * microsecond, and a 64 bits integer is used to avoid overflows (maximum
  126.  * time interval is then 292271 years, which should be long enough for any
  127.  * video). Dates are stored as microseconds since a common date (usually the
  128.  * epoch). Note that date and time intervals can be manipulated using regular
  129.  * arithmetic operators, and that no special functions are required.
  130.  */
  131. typedef int64_t mtime_t;
  132.  
  133. /**
  134.  * The vlc_fourcc_t type.
  135.  *
  136.  * See http://www.webartz.com/fourcc/ for a very detailed list.
  137.  */
  138. typedef uint32_t vlc_fourcc_t;
  139.  
  140. #ifdef WORDS_BIGENDIAN
  141. #   define VLC_FOURCC( a, b, c, d ) \
  142.         ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \
  143.            | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )
  144. #   define VLC_TWOCC( a, b ) \
  145.         ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) )
  146.  
  147. #else
  148. #   define VLC_FOURCC( a, b, c, d ) \
  149.         ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \
  150.            | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) )
  151. #   define VLC_TWOCC( a, b ) \
  152.         ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) )
  153.  
  154. #endif
  155.  
  156. /**
  157.  * Translate a vlc_fourcc into its string representation. This function
  158.  * assumes there is enough room in psz_fourcc to store 4 characters in.
  159.  *
  160.  * \param fcc a vlc_fourcc_t
  161.  * \param psz_fourcc string to store string representation of vlc_fourcc in
  162.  */
  163. static inline void vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc )
  164. {
  165.     memcpy( psz_fourcc, &fcc, 4 );
  166. }
  167.  
  168. #define vlc_fourcc_to_char( a, b ) \
  169.         vlc_fourcc_to_char( (vlc_fourcc_t)(a), (char *)(b) )
  170.  
  171. /*****************************************************************************
  172.  * Classes declaration
  173.  *****************************************************************************/
  174.  
  175. /* Internal types */
  176. typedef struct vlc_list_t vlc_list_t;
  177. typedef struct vlc_object_t vlc_object_t;
  178. typedef struct libvlc_int_t libvlc_int_t;
  179. typedef struct date_t date_t;
  180. typedef struct dict_entry_t dict_entry_t;
  181. typedef struct dict_t dict_t;
  182.  
  183. /* Playlist */
  184.  
  185. /* FIXME */
  186. /**
  187.  * Playlist commands
  188.  */
  189. typedef enum {
  190.     PLAYLIST_PLAY,      /**< No arg.                            res=can fail*/
  191.     PLAYLIST_VIEWPLAY,  /**< arg1= playlist_item_t*,*/
  192.                         /**  arg2 = playlist_item_t*          , res=can fail */
  193.     PLAYLIST_PAUSE,     /**< No arg                             res=can fail*/
  194.     PLAYLIST_STOP,      /**< No arg                             res=can fail*/
  195.     PLAYLIST_SKIP,      /**< arg1=int,                          res=can fail*/
  196. } playlist_command_t;
  197.  
  198.  
  199. typedef struct playlist_t playlist_t;
  200. typedef struct playlist_item_t playlist_item_t;
  201. typedef struct playlist_view_t playlist_view_t;
  202. typedef struct services_discovery_t services_discovery_t;
  203. typedef struct services_discovery_sys_t services_discovery_sys_t;
  204. typedef struct playlist_add_t playlist_add_t;
  205.  
  206. /* Modules */
  207. typedef struct module_bank_t module_bank_t;
  208. typedef struct module_t module_t;
  209. typedef struct module_config_t module_config_t;
  210. typedef struct module_symbols_t module_symbols_t;
  211. typedef struct module_cache_t module_cache_t;
  212.  
  213. typedef struct config_category_t config_category_t;
  214.  
  215. /* Input */
  216. typedef struct input_thread_t input_thread_t;
  217. typedef struct input_thread_sys_t input_thread_sys_t;
  218. typedef struct input_item_t input_item_t;
  219. typedef struct input_item_node_t input_item_node_t;
  220. typedef struct access_t access_t;
  221. typedef struct access_sys_t access_sys_t;
  222. typedef struct stream_t     stream_t;
  223. typedef struct stream_sys_t stream_sys_t;
  224. typedef struct demux_t  demux_t;
  225. typedef struct demux_sys_t demux_sys_t;
  226. typedef struct es_out_t     es_out_t;
  227. typedef struct es_out_id_t  es_out_id_t;
  228. typedef struct es_out_sys_t es_out_sys_t;
  229. typedef struct es_descriptor_t es_descriptor_t;
  230. typedef struct seekpoint_t seekpoint_t;
  231. typedef struct info_t info_t;
  232. typedef struct info_category_t info_category_t;
  233. typedef struct input_attachment_t input_attachment_t;
  234.  
  235. /* Format */
  236. typedef struct audio_format_t audio_format_t;
  237. typedef struct video_format_t video_format_t;
  238. typedef struct subs_format_t subs_format_t;
  239. typedef struct es_format_t es_format_t;
  240. typedef struct video_palette_t video_palette_t;
  241.  
  242. /* Audio */
  243. typedef struct aout_instance_t aout_instance_t;
  244. typedef struct aout_sys_t aout_sys_t;
  245. typedef struct aout_fifo_t aout_fifo_t;
  246. typedef struct aout_input_t aout_input_t;
  247. typedef struct block_t aout_buffer_t;
  248. typedef audio_format_t audio_sample_format_t;
  249. typedef struct audio_date_t audio_date_t;
  250. typedef struct aout_filter_t aout_filter_t;
  251.  
  252. /* Video */
  253. typedef struct vout_thread_t vout_thread_t;
  254. typedef struct vout_sys_t vout_sys_t;
  255.  
  256. typedef video_format_t video_frame_format_t;
  257. typedef struct picture_t picture_t;
  258. typedef struct picture_sys_t picture_sys_t;
  259. typedef struct picture_heap_t picture_heap_t;
  260.  
  261. /* Subpictures */
  262. typedef struct spu_t spu_t;
  263. typedef struct subpicture_t subpicture_t;
  264. typedef struct subpicture_sys_t subpicture_sys_t;
  265. typedef struct subpicture_region_t subpicture_region_t;
  266. typedef struct text_style_t text_style_t;
  267.  
  268. typedef struct image_handler_t image_handler_t;
  269.  
  270. /* Stream output */
  271. typedef struct sout_instance_t sout_instance_t;
  272. typedef struct sout_instance_sys_t sout_instance_sys_t;
  273.  
  274. typedef struct sout_input_t sout_input_t;
  275. typedef struct sout_packetizer_input_t sout_packetizer_input_t;
  276.  
  277. typedef struct sout_access_out_t sout_access_out_t;
  278. typedef struct sout_access_out_sys_t   sout_access_out_sys_t;
  279.  
  280. typedef struct sout_mux_t sout_mux_t;
  281. typedef struct sout_mux_sys_t sout_mux_sys_t;
  282.  
  283. typedef struct sout_stream_t    sout_stream_t;
  284. typedef struct sout_stream_sys_t sout_stream_sys_t;
  285.  
  286. typedef struct config_chain_t       config_chain_t;
  287. typedef struct session_descriptor_t session_descriptor_t;
  288. typedef struct announce_method_t announce_method_t;
  289.  
  290. typedef struct sout_param_t sout_param_t;
  291. typedef struct sout_pcat_t sout_pcat_t;
  292. typedef struct sout_std_t sout_std_t;
  293. typedef struct sout_display_t sout_display_t;
  294. typedef struct sout_duplicate_t sout_duplicate_t;
  295. typedef struct sout_transcode_t sout_transcode_t;
  296. typedef struct sout_chain_t sout_chain_t;
  297. typedef struct streaming_profile_t streaming_profile_t;
  298. typedef struct sout_module_t sout_module_t;
  299. typedef struct sout_gui_descr_t sout_gui_descr_t;
  300. typedef struct profile_parser_t profile_parser_t;
  301.  
  302. /* Decoders */
  303. typedef struct decoder_t         decoder_t;
  304. typedef struct decoder_sys_t     decoder_sys_t;
  305. typedef struct decoder_synchro_t decoder_synchro_t;
  306.  
  307. /* Encoders */
  308. typedef struct encoder_t      encoder_t;
  309. typedef struct encoder_sys_t  encoder_sys_t;
  310.  
  311. /* Filters */
  312. typedef struct filter_t filter_t;
  313. typedef struct filter_sys_t filter_sys_t;
  314.  
  315. /* Network */
  316. typedef struct network_socket_t network_socket_t;
  317. typedef struct virtual_socket_t v_socket_t;
  318. typedef struct sockaddr sockaddr;
  319. typedef struct addrinfo addrinfo;
  320. typedef struct vlc_acl_t vlc_acl_t;
  321. typedef struct vlc_url_t vlc_url_t;
  322.  
  323. /* Misc */
  324. typedef struct iso639_lang_t iso639_lang_t;
  325. typedef struct device_t device_t;
  326. typedef struct device_probe_t device_probe_t;
  327. typedef struct probe_sys_t probe_sys_t;
  328.  
  329. /* block */
  330. typedef struct block_t      block_t;
  331. typedef struct block_fifo_t block_fifo_t;
  332.  
  333. /* httpd */
  334. typedef struct httpd_t          httpd_t;
  335. typedef struct httpd_host_t     httpd_host_t;
  336. typedef struct httpd_url_t      httpd_url_t;
  337. typedef struct httpd_client_t   httpd_client_t;
  338. typedef struct httpd_callback_sys_t httpd_callback_sys_t;
  339. typedef struct httpd_message_t  httpd_message_t;
  340. typedef int    (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, const httpd_message_t *query );
  341. typedef struct httpd_file_t     httpd_file_t;
  342. typedef struct httpd_file_sys_t httpd_file_sys_t;
  343. typedef int (*httpd_file_callback_t)( httpd_file_sys_t *, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data );
  344. typedef struct httpd_handler_t  httpd_handler_t;
  345. typedef struct httpd_handler_sys_t httpd_handler_sys_t;
  346. typedef int (*httpd_handler_callback_t)( httpd_handler_sys_t *, httpd_handler_t *, char *psz_url, uint8_t *psz_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data );
  347. typedef struct httpd_redirect_t httpd_redirect_t;
  348. typedef struct httpd_stream_t httpd_stream_t;
  349.  
  350. /* TLS support */
  351. typedef struct tls_server_t tls_server_t;
  352. typedef struct tls_session_t tls_session_t;
  353.  
  354. /* Hashing */
  355. typedef struct md5_s md5_t;
  356.  
  357. /* XML */
  358. typedef struct xml_t xml_t;
  359. typedef struct xml_sys_t xml_sys_t;
  360. typedef struct xml_reader_t xml_reader_t;
  361. typedef struct xml_reader_sys_t xml_reader_sys_t;
  362.  
  363. /* vod server */
  364. typedef struct vod_t     vod_t;
  365. typedef struct vod_sys_t vod_sys_t;
  366. typedef struct vod_media_t vod_media_t;
  367.  
  368. /* opengl */
  369. typedef struct opengl_t     opengl_t;
  370. typedef struct opengl_sys_t opengl_sys_t;
  371.  
  372. /* osdmenu */
  373. typedef struct osd_menu_t   osd_menu_t;
  374. typedef struct osd_state_t  osd_state_t;
  375. typedef struct osd_event_t  osd_event_t;
  376. typedef struct osd_button_t osd_button_t;
  377. typedef struct osd_menu_state_t osd_menu_state_t;
  378.  
  379. /* VLM */
  380. typedef struct vlm_t         vlm_t;
  381. typedef struct vlm_message_t vlm_message_t;
  382.  
  383. /* misc */
  384. typedef struct vlc_meta_t    vlc_meta_t;
  385.  
  386. /* Stats */
  387. typedef struct counter_t     counter_t;
  388. typedef struct counter_sample_t counter_sample_t;
  389. typedef struct stats_handler_t stats_handler_t;
  390. typedef struct input_stats_t input_stats_t;
  391.  
  392. /* Update */
  393. typedef struct update_t update_t;
  394. typedef struct update_iterator_t update_iterator_t;
  395.  
  396. /* Meta engine */
  397. typedef struct meta_engine_t meta_engine_t;
  398.  
  399. /* stat/lstat/fstat */
  400. #ifdef WIN32
  401. #include <sys/stat.h>
  402.  
  403. # ifndef UNDER_CE
  404. struct _stati64;
  405. #define stat _stati64
  406. #define fstat _fstati64
  407. #endif
  408.  
  409. /* You should otherwise use vlc_stat and vlc_lstat. */
  410. #else
  411. struct stat;
  412. #endif
  413.  
  414. /**
  415.  * VLC value structure
  416.  */
  417. typedef union
  418. {
  419.     int             i_int;
  420.     bool            b_bool;
  421.     float           f_float;
  422.     char *          psz_string;
  423.     void *          p_address;
  424.     vlc_object_t *  p_object;
  425.     vlc_list_t *    p_list;
  426.     mtime_t         i_time;
  427.     struct { int32_t x; int32_t y; } coords;
  428.  
  429.     /* Make sure the structure is at least 64bits */
  430.     uint8_t padding[8];
  431.  
  432. } vlc_value_t;
  433.  
  434. /**
  435.  * VLC list structure
  436.  */
  437. struct vlc_list_t
  438. {
  439.     int             i_count;
  440.     vlc_value_t *   p_values;
  441.     int *           pi_types;
  442.  
  443. };
  444.  
  445. /**
  446.  * \defgroup var_type Variable types
  447.  * These are the different types a vlc variable can have.
  448.  * @{
  449.  */
  450. #define VLC_VAR_VOID      0x0010
  451. #define VLC_VAR_BOOL      0x0020
  452. #define VLC_VAR_INTEGER   0x0030
  453. #define VLC_VAR_HOTKEY    0x0031
  454. #define VLC_VAR_STRING    0x0040
  455. #define VLC_VAR_MODULE    0x0041
  456. #define VLC_VAR_FILE      0x0042
  457. #define VLC_VAR_DIRECTORY 0x0043
  458. #define VLC_VAR_VARIABLE  0x0044
  459. #define VLC_VAR_FLOAT     0x0050
  460. #define VLC_VAR_TIME      0x0060
  461. #define VLC_VAR_ADDRESS   0x0070
  462. #define VLC_VAR_MUTEX     0x0080
  463. #define VLC_VAR_LIST      0x0090
  464. #define VLC_VAR_COORDS    0x00A0
  465. /**@}*/
  466.  
  467. /*****************************************************************************
  468.  * Error values (shouldn't be exposed)
  469.  *****************************************************************************/
  470. #define VLC_SUCCESS         -0                                   /* No error */
  471. #define VLC_ENOMEM          -1                          /* Not enough memory */
  472. #define VLC_ETIMEOUT        -3                                    /* Timeout */
  473.  
  474. #define VLC_ENOMOD         -10                           /* Module not found */
  475.  
  476. #define VLC_ENOOBJ         -20                           /* Object not found */
  477.  
  478. #define VLC_ENOVAR         -30                         /* Variable not found */
  479. #define VLC_EBADVAR        -31                         /* Bad variable value */
  480.  
  481. #define VLC_ENOITEM        -40                           /**< Item not found */
  482.  
  483. #define VLC_EEXIT         -255                             /* Program exited */
  484. #define VLC_EEXITSUCCESS  -999                /* Program exited successfully */
  485. #define VLC_EGENERIC      -666                              /* Generic error */
  486.  
  487. /*****************************************************************************
  488.  * Variable callbacks
  489.  *****************************************************************************/
  490. typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
  491.                                    char const *,            /* variable name */
  492.                                    vlc_value_t,                 /* old value */
  493.                                    vlc_value_t,                 /* new value */
  494.                                    void * );                /* callback data */
  495.  
  496. /*****************************************************************************
  497.  * Plug-in stuff
  498.  *****************************************************************************/
  499.  
  500. #ifdef __cplusplus
  501. # define LIBVLC_EXTERN extern "C"
  502. #else
  503. # define LIBVLC_EXTERN extern
  504. #endif
  505. #if defined (WIN32) && defined (DLL_EXPORT)
  506. #if defined (UNDER_CE)
  507. # include <windef.h>
  508. #endif
  509. # define LIBVLC_EXPORT __declspec(dllexport)
  510. #else
  511. # define LIBVLC_EXPORT
  512. #endif
  513. #define VLC_EXPORT( type, name, args ) \
  514.                         LIBVLC_EXTERN LIBVLC_EXPORT type name args
  515.  
  516. /*****************************************************************************
  517.  * OS-specific headers and thread types
  518.  *****************************************************************************/
  519. #if defined( WIN32 ) || defined( UNDER_CE )
  520. #   define WIN32_LEAN_AND_MEAN
  521. #   include <windows.h>
  522. #endif
  523.  
  524. #include "vlc_mtime.h"
  525. #include "vlc_threads.h"
  526.  
  527. /*****************************************************************************
  528.  * Common structure members
  529.  *****************************************************************************/
  530.  
  531. /* VLC_COMMON_MEMBERS : members common to all basic vlc objects */
  532. #define VLC_COMMON_MEMBERS                                                  \
  533. /** \name VLC_COMMON_MEMBERS                                                \
  534.  * these members are common for all vlc objects                             \
  535.  */                                                                         \
  536. /**@{*/                                                                     \
  537.     const char *psz_object_type;                                            \
  538.                                                                             \
  539.     /* Messages header */                                                   \
  540.     char *psz_header;                                                       \
  541.     int  i_flags;                                                           \
  542.                                                                             \
  543.     /* Object properties */                                                 \
  544.     volatile bool b_die;                   /**< set by the outside */ \
  545.     bool b_force;      /**< set by the outside (eg. module_need()) */ \
  546.                                                                             \
  547.     /* Stuff related to the libvlc structure */                             \
  548.     libvlc_int_t *p_libvlc;                  /**< (root of all evil) - 1 */ \
  549.                                                                             \
  550.     vlc_object_t *  p_parent;                            /**< our parent */ \
  551.                                                                             \
  552. /**@}*/                                                                     \
  553.  
  554. /* VLC_OBJECT: attempt at doing a clever cast */
  555. #if defined( __GNUC__ ) && __GNUC__ > 3
  556. # ifndef __cplusplus
  557. #  define VLC_OBJECT( x ) \
  558.     __builtin_choose_expr(__builtin_offsetof(__typeof__(*x), psz_object_type), \
  559.                           (void)0 /* screw you */, (vlc_object_t *)(x))
  560. # else
  561. #  define VLC_OBJECT( x ) \
  562.     ((vlc_object_t *)(x) \
  563.       + 0 * __builtin_offsetof(__typeof__(*x), psz_object_type))
  564. # endif
  565. #else
  566. # define VLC_OBJECT( x ) ((vlc_object_t *)(x))
  567. #endif
  568.  
  569. typedef struct gc_object_t
  570. {
  571.     vlc_spinlock_t spin;
  572.     uintptr_t      refs;
  573.     void          (*pf_destructor) (struct gc_object_t *);
  574. } gc_object_t;
  575.  
  576. /**
  577.  * These members are common to all objects that wish to be garbage-collected.
  578.  */
  579. #define VLC_GC_MEMBERS gc_object_t vlc_gc_data;
  580.  
  581. VLC_EXPORT(void *, vlc_gc_init, (gc_object_t *, void (*)(gc_object_t *)));
  582. VLC_EXPORT(void *, vlc_hold, (gc_object_t *));
  583. VLC_EXPORT(void, vlc_release, (gc_object_t *));
  584.  
  585. #define vlc_gc_init( a,b ) vlc_gc_init( &(a)->vlc_gc_data, (b) )
  586. #define vlc_gc_incref( a ) vlc_hold( &(a)->vlc_gc_data )
  587. #define vlc_gc_decref( a ) vlc_release( &(a)->vlc_gc_data )
  588. #define vlc_priv( gc, t ) ((t *)(((char *)(gc)) - offsetof(t, vlc_gc_data)))
  589.  
  590. /*****************************************************************************
  591.  * Macros and inline functions
  592.  *****************************************************************************/
  593.  
  594. /* CEIL: division with round to nearest greater integer */
  595. #define CEIL(n, d)  ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) )
  596.  
  597. /* PAD: PAD(n, d) = CEIL(n ,d) * d */
  598. #define PAD(n, d)   ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) )
  599.  
  600. /* __MAX and __MIN: self explanatory */
  601. #ifndef __MAX
  602. #   define __MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
  603. #endif
  604. #ifndef __MIN
  605. #   define __MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
  606. #endif
  607.  
  608. LIBVLC_USED
  609. static inline int64_t GCD ( int64_t a, int64_t b )
  610. {
  611.     while( b )
  612.     {
  613.         int64_t c = a % b;
  614.         a = b;
  615.         b = c;
  616.     }
  617.     return a;
  618. }
  619.  
  620. /* function imported from libavutil/common.h */
  621. LIBVLC_USED
  622. static inline uint8_t clip_uint8_vlc( int32_t a )
  623. {
  624.     if( a&(~255) ) return (-a)>>31;
  625.     else           return a;
  626. }
  627.  
  628. /* Count leading zeroes */
  629. LIBVLC_USED
  630. static inline unsigned clz (unsigned x)
  631. {
  632. #ifdef __GNUC_
  633.     return __builtin_clz (x);
  634. #else
  635.     unsigned i = sizeof (x) * 8;
  636.  
  637.     while (x)
  638.     {
  639.         x = x >> 1;
  640.         i--;
  641.     }
  642.     return i;
  643. #endif
  644. }
  645.  
  646. #define clz8( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint8_t)) * 8))
  647. #define clz16( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint16_t)) * 8))
  648. /* XXX: this assumes that int is 32-bits or more */
  649. #define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8))
  650.  
  651. /* Free and set set the variable to NULL */
  652. #define FREENULL(a) do { free( a ); a = NULL; } while(0)
  653.  
  654. #define EMPTY_STR(str) (!str || !*str)
  655.  
  656. VLC_EXPORT( char const *, vlc_error, ( int ) LIBVLC_USED );
  657.  
  658. #include <vlc_arrays.h>
  659.  
  660. /* MSB (big endian)/LSB (little endian) conversions - network order is always
  661.  * MSB, and should be used for both network communications and files. */
  662. LIBVLC_USED
  663. static inline uint16_t U16_AT( const void * _p )
  664. {
  665.     const uint8_t * p = (const uint8_t *)_p;
  666.     return ( ((uint16_t)p[0] << 8) | p[1] );
  667. }
  668.  
  669. LIBVLC_USED
  670. static inline uint32_t U32_AT( const void * _p )
  671. {
  672.     const uint8_t * p = (const uint8_t *)_p;
  673.     return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16)
  674.               | ((uint32_t)p[2] << 8) | p[3] );
  675. }
  676.  
  677. LIBVLC_USED
  678. static inline uint64_t U64_AT( const void * _p )
  679. {
  680.     const uint8_t * p = (const uint8_t *)_p;
  681.     return ( ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48)
  682.               | ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32)
  683.               | ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16)
  684.               | ((uint64_t)p[6] << 8) | p[7] );
  685. }
  686.  
  687. LIBVLC_USED
  688. static inline uint16_t GetWLE( const void * _p )
  689. {
  690.     const uint8_t * p = (const uint8_t *)_p;
  691.     return ( ((uint16_t)p[1] << 8) | p[0] );
  692. }
  693.  
  694. LIBVLC_USED
  695. static inline uint32_t GetDWLE( const void * _p )
  696. {
  697.     const uint8_t * p = (const uint8_t *)_p;
  698.     return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16)
  699.               | ((uint32_t)p[1] << 8) | p[0] );
  700. }
  701.  
  702. LIBVLC_USED
  703. static inline uint64_t GetQWLE( const void * _p )
  704. {
  705.     const uint8_t * p = (const uint8_t *)_p;
  706.     return ( ((uint64_t)p[7] << 56) | ((uint64_t)p[6] << 48)
  707.               | ((uint64_t)p[5] << 40) | ((uint64_t)p[4] << 32)
  708.               | ((uint64_t)p[3] << 24) | ((uint64_t)p[2] << 16)
  709.               | ((uint64_t)p[1] << 8) | p[0] );
  710. }
  711.  
  712. #define GetWBE( p )     U16_AT( p )
  713. #define GetDWBE( p )    U32_AT( p )
  714. #define GetQWBE( p )    U64_AT( p )
  715.  
  716. /* Helper writer functions */
  717. #define SetWLE( p, v ) _SetWLE( (uint8_t*)(p), v)
  718. static inline void _SetWLE( uint8_t *p, uint16_t i_dw )
  719. {
  720.     p[1] = ( i_dw >>  8 )&0xff;
  721.     p[0] = ( i_dw       )&0xff;
  722. }
  723.  
  724. #define SetDWLE( p, v ) _SetDWLE( (uint8_t*)(p), v)
  725. static inline void _SetDWLE( uint8_t *p, uint32_t i_dw )
  726. {
  727.     p[3] = ( i_dw >> 24 )&0xff;
  728.     p[2] = ( i_dw >> 16 )&0xff;
  729.     p[1] = ( i_dw >>  8 )&0xff;
  730.     p[0] = ( i_dw       )&0xff;
  731. }
  732. #define SetQWLE( p, v ) _SetQWLE( (uint8_t*)(p), v)
  733. static inline void _SetQWLE( uint8_t *p, uint64_t i_qw )
  734. {
  735.     SetDWLE( p,   i_qw&0xffffffff );
  736.     SetDWLE( p+4, ( i_qw >> 32)&0xffffffff );
  737. }
  738. #define SetWBE( p, v ) _SetWBE( (uint8_t*)(p), v)
  739. static inline void _SetWBE( uint8_t *p, uint16_t i_dw )
  740. {
  741.     p[0] = ( i_dw >>  8 )&0xff;
  742.     p[1] = ( i_dw       )&0xff;
  743. }
  744.  
  745. #define SetDWBE( p, v ) _SetDWBE( (uint8_t*)(p), v)
  746. static inline void _SetDWBE( uint8_t *p, uint32_t i_dw )
  747. {
  748.     p[0] = ( i_dw >> 24 )&0xff;
  749.     p[1] = ( i_dw >> 16 )&0xff;
  750.     p[2] = ( i_dw >>  8 )&0xff;
  751.     p[3] = ( i_dw       )&0xff;
  752. }
  753. #define SetQWBE( p, v ) _SetQWBE( (uint8_t*)(p), v)
  754. static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
  755. {
  756.     SetDWBE( p+4,   i_qw&0xffffffff );
  757.     SetDWBE( p, ( i_qw >> 32)&0xffffffff );
  758. }
  759.  
  760. #define hton16(i) htons(i)
  761. #define hton32(i) htonl(i)
  762. #define ntoh16(i) ntohs(i)
  763. #define ntoh32(i) ntohl(i)
  764.  
  765. LIBVLC_USED
  766. static inline uint64_t ntoh64 (uint64_t ll)
  767. {
  768.     union { uint64_t qw; uint8_t b[16]; } v = { ll };
  769.     return ((uint64_t)v.b[0] << 56)
  770.          | ((uint64_t)v.b[1] << 48)
  771.          | ((uint64_t)v.b[2] << 40)
  772.          | ((uint64_t)v.b[3] << 32)
  773.          | ((uint64_t)v.b[4] << 24)
  774.          | ((uint64_t)v.b[5] << 16)
  775.          | ((uint64_t)v.b[6] <<  8)
  776.          | ((uint64_t)v.b[7] <<  0);
  777. }
  778. #define hton64(i) ntoh64(i)
  779.  
  780. /* */
  781. #define VLC_UNUSED(x) (void)(x)
  782.  
  783. /* Stuff defined in src/extras/libc.c */
  784.  
  785. #if defined(WIN32) || defined(UNDER_CE)
  786. /* win32, cl and icl support */
  787. #   if defined( _MSC_VER ) || !defined( __MINGW32__ )
  788. #       define __attribute__(x)
  789. #       define __inline__      __inline
  790. #       define S_IFBLK         0x3000  /* Block */
  791. #       define S_ISBLK(m)      (0)
  792. #       define S_ISCHR(m)      (0)
  793. #       define S_ISFIFO(m)     (((m)&_S_IFMT) == _S_IFIFO)
  794. #       define S_ISREG(m)      (((m)&_S_IFMT) == _S_IFREG)
  795. #   endif
  796.  
  797. /* several type definitions */
  798. #   if defined( __MINGW32__ )
  799. #       if !defined( _OFF_T_ )
  800.             typedef long long _off_t;
  801.             typedef _off_t off_t;
  802. #           define _OFF_T_
  803. #       else
  804. #           ifdef off_t
  805. #               undef off_t
  806. #           endif
  807. #           define off_t long long
  808. #       endif
  809. #   endif
  810.  
  811. #   if defined( _MSC_VER ) && !defined( __WXMSW__ )
  812. #       if !defined( _OFF_T_DEFINED )
  813.             typedef __int64 off_t;
  814. #           define _OFF_T_DEFINED
  815. #       else
  816.             /* for wx compatibility typedef long off_t; */
  817. #           define off_t __int64
  818. #       endif
  819. #   endif
  820.  
  821. #   if defined( __BORLANDC__ )
  822. #       undef off_t
  823. #       define off_t unsigned __int64
  824. #   endif
  825.  
  826. #   ifndef O_NONBLOCK
  827. #       define O_NONBLOCK 0
  828. #   endif
  829.  
  830. #   ifndef alloca
  831. #       define alloca _alloca
  832. #   endif
  833.  
  834. #   include <tchar.h>
  835. #endif
  836.  
  837. VLC_EXPORT( bool, vlc_ureduce, ( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ) );
  838.  
  839. /* iconv wrappers (defined in src/extras/libc.c) */
  840. typedef void *vlc_iconv_t;
  841. VLC_EXPORT( vlc_iconv_t, vlc_iconv_open, ( const char *, const char * ) LIBVLC_USED );
  842. VLC_EXPORT( size_t, vlc_iconv, ( vlc_iconv_t, const char **, size_t *, char **, size_t * ) LIBVLC_USED );
  843. VLC_EXPORT( int, vlc_iconv_close, ( vlc_iconv_t ) );
  844.  
  845. /* execve wrapper (defined in src/extras/libc.c) */
  846. VLC_EXPORT( int, vlc_execve, ( vlc_object_t *p_object, int i_argc, char *const *pp_argv, char *const *pp_env, const char *psz_cwd, const char *p_in, size_t i_in, char **pp_data, size_t *pi_data ) LIBVLC_USED );
  847. #define vlc_execve(a,b,c,d,e,f,g,h,i) vlc_execve(VLC_OBJECT(a),b,c,d,e,f,g,h,i)
  848.  
  849. /* dir wrappers (defined in src/extras/libc.c) */
  850. VLC_EXPORT(int, vlc_wclosedir, ( void *_p_dir ));
  851.  
  852. VLC_EXPORT( void, vlc_tdestroy, ( void *, void (*)(void *) ) );
  853.  
  854. /* Fast large memory copy and memory set */
  855. VLC_EXPORT( void *, vlc_memcpy, ( void *, const void *, size_t ) );
  856. VLC_EXPORT( void *, vlc_memset, ( void *, int, size_t ) );
  857.  
  858. /*****************************************************************************
  859.  * I18n stuff
  860.  *****************************************************************************/
  861. VLC_EXPORT( char *, vlc_gettext, ( const char *msgid ) LIBVLC_FORMAT_ARG(1) );
  862.  
  863. #define vlc_pgettext( ctx, id ) \
  864.         vlc_pgettext_aux( ctx "\004" id, id )
  865.  
  866. LIBVLC_FORMAT_ARG(2)
  867. static inline const char *vlc_pgettext_aux( const char *ctx, const char *id )
  868. {
  869.     const char *tr = vlc_gettext( ctx );
  870.     return (tr == ctx) ? id : tr;
  871. }
  872.  
  873. /*****************************************************************************
  874.  * Loosy memory allocation functions. Do not use in new code.
  875.  *****************************************************************************/
  876. static inline void *xmalloc (size_t len)
  877. {
  878.     void *ptr = malloc (len);
  879.     if (unlikely (ptr == NULL))
  880.         abort ();
  881.     return ptr;
  882. }
  883.  
  884. static inline void *xrealloc (void *ptr, size_t len)
  885. {
  886.     void *nptr = realloc (ptr, len);
  887.     if (unlikely (nptr == NULL))
  888.         abort ();
  889.     return nptr;
  890. }
  891.  
  892. /*****************************************************************************
  893.  * libvlc features
  894.  *****************************************************************************/
  895. VLC_EXPORT( const char *, VLC_Version, ( void ) LIBVLC_USED );
  896. VLC_EXPORT( const char *, VLC_CompileBy, ( void ) LIBVLC_USED );
  897. VLC_EXPORT( const char *, VLC_CompileHost, ( void ) LIBVLC_USED );
  898. VLC_EXPORT( const char *, VLC_Compiler, ( void ) LIBVLC_USED );
  899.  
  900. /*****************************************************************************
  901.  * Additional vlc stuff
  902.  *****************************************************************************/
  903. #include "vlc_messages.h"
  904. #include "vlc_objects.h"
  905. #include "vlc_variables.h"
  906. #include "vlc_modules.h"
  907. #include "vlc_main.h"
  908. #include "vlc_configuration.h"
  909.  
  910. #if defined( WIN32 ) || defined( UNDER_CE )
  911. #   define DIR_SEP_CHAR '\\'
  912. #   define DIR_SEP "\\"
  913. #   define PATH_SEP_CHAR ';'
  914. #   define PATH_SEP ";"
  915. #else
  916. #   define DIR_SEP_CHAR '/'
  917. #   define DIR_SEP "/"
  918. #   define PATH_SEP_CHAR ':'
  919. #   define PATH_SEP ":"
  920. #endif
  921.  
  922. #define LICENSE_MSG \
  923.   _("This program comes with NO WARRANTY, to the extent permitted by " \
  924.     "law.\nYou may redistribute it under the terms of the GNU General " \
  925.     "Public License;\nsee the file named COPYING for details.\n" \
  926.     "Written by the VideoLAN team; see the AUTHORS file.\n")
  927.  
  928. #endif /* !VLC_COMMON_H */
  929.